package sim_moteur.factory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import sim_moteur.element.vegetal.Vegetal;

public class VegetauxFactory extends AbstractFactory implements
		ChoseFactoryI<Vegetal> {

	public final static String VEGETAL_NAME = "Vegetal_";
	public final static float POURCENTAGE_DEGENERATION_SPONTANEE = 0.03f; // 3%
	public final static String SUFFIX_VITALITE = ".initial.vie";

	private int compteur = 0;
	private int numeroSimulation = 0;

	private static VegetauxFactory instance;

	private VegetauxFactory() {

	}

	/**
	 * Retourne la seule instance de fabrique de vegetaux. (singleton) Noter que
	 * chaque thread possède sa propre copie du singleton
	 * 
	 * @return la fabrique
	 */
	public static VegetauxFactory getInstance() {
		if (instance == null) {
			instance = new VegetauxFactory();
		}
		return instance;
	}

	@Override
	public Vegetal get() {
		// Nous modifions un peu le nom avec le numéro de simulation dedans
		String nom = SIM_PREFIX_NAME + numeroSimulation + "." + VEGETAL_NAME
				+ compteur++;
		float vitalite = properties.getFloatProperty(nom + SUFFIX_VITALITE);
		if (vitalite < 0)
			vitalite = 1;

		Vegetal vegetal = new Vegetal(nom, vitalite);
		place(vegetal);

		// On cherche les propriétés concernant l'objet fabriqué
		List<String> propList = properties.tourveProprietesQuiCommencePar(nom);
		if (propList.contains(nom + "initial.vie")) {
			vegetal.setVie(properties.getFloatProperty(nom + "initial.vie"));
		}
		nombre--;
		return vegetal;
	}

	/**
	 * Réinitialise la fabrique
	 */
	public static void reset() {
		instance = new VegetauxFactory();
	}

	@Override
	public Map<String, Vegetal> getAll() {
		Map<String, Vegetal> retMap = new HashMap<>();
		while (nombre > 0) {
			Vegetal nouveauVegetal = get();
			retMap.put(nouveauVegetal.getName(), nouveauVegetal);
		}
		return retMap;
	}

	@Override
	public void init(int pNumeroSimulation) {
		numeroSimulation = pNumeroSimulation;
		nombre = nombreVegetauxMax[numeroSimulation];

	}

}
